/**
 * 修改一个cookie值，如果没有当前值则为添加一个 注意：仅在浏览器环境可运行，httpOnly这样的Boolean类型的参数并不能在js设置 设置了也无法保存
 * @param {String} name cookie名
 * @param {String|Number} value cookie值
 * @param {Object} options cookie的其他值
 * @param {Number} options.expires cookie的过期天数
 * @param {String} options.path cookie的路径 默认值：/
 * @param {String} options.domain 指示cookie的域 无默认值
 * @param {Boolean} options.secure 指示cookie是否仅通过HTTPS发送（false默认情况下，对于HTTP，true默认情况下，对于HTTPS）。在下面阅读有关此选项的更多信息。
 * @param {Boolean} options.httpOnly 一个布尔值，指示cookie是否仅通过HTTP（S）发送，并且不提供给客户端JavaScript（true默认情况下）
 * @param {Boolean|String} options.sameSite 指示cookie是“相同站点” cookie（false默认情况下）。可以将其设置为’strict’，‘lax’或true（映射到’strict’）。
 * @param {Boolean} options.signed 一个布尔值，指示是否要对cookie进行签名（false默认情况下）。如果为真，.sig则还将发送另一个具有后缀的同名Cookie，其27字节的url安全base64 SHA1值表示针对第一个Keygrip密钥的cookie-name = cookie-value的哈希值。此签名密钥用于检测下次接收cookie时的篡改。
 * @param {Boolean} options.overwrite 一个布尔值，指示是否覆盖以前设置的同名Cookie（false默认情况下）。如果是这样，则在设置此Cookie时，将从相同名称的同一个请求中设置的所有Cookie（无论路径或域如何）都从Set-Cookie标头中过滤掉。
 */

module.exports = function set(name, value, options = { expires: 1, path: '/' }) {
  if (typeof window === 'undefined') return false;
  if (!name || !value) return false;
  const { expires } = options;
  const day = expires && expires.constructor === Number ? expires : 1;
  options.expires = new Date(Date.now() + day * 86400000).toGMTString();
  let stringOptions = '';
  for (const key in options) {
    if (Object.hasOwnProperty.call(options, key)) {
      const element = options[key];
      if (element === true) continue;
      lowerCaseKey = key.toLocaleLowerCase();
      if (!['expires', 'path', 'domain'].includes(lowerCaseKey)) continue;
      // Considers RFC 6265 section 5.2:
      // ...
      // 3.  If the remaining unparsed-attributes contains a %x3B (";")
      //     character:
      // Consume the characters of the unparsed-attributes up to,
      // not including, the first %x3B (";") character.
      // ...
      stringOptions += `${lowerCaseKey}=${element.split(';')[0]}; `;
    }
  }
  name = encodeURIComponent(name);
  value = encodeURIComponent(value);
  window.document.cookie = `${name}=${value}; ${stringOptions}`;
};
